共计 2147 个字符,预计需要花费 6 分钟才能阅读完成。
一. 什么是迭代器
-
器 : 工具
-
迭代 : 是一个重复的过程, 但不是单纯的重复, 每次重复都是基于上一次的结果而进行的
-
迭代器 : 迭代取值的工具
⛅迭代
l={'x':1,'y':2}
n=0
while n < len(l):
print(l[n])
n+=1
二. 为何要使用迭代器
- 为了找到一种通用的迭代取值方案
- 为了节省内存
三. 可迭代对象 (iterable)
-
在 python 中,但凡内置有
__iter__
方法的对象,都是可迭代的对象 -
但凡调用了
__iter__
方法, 就会将该类型转换成迭代器对象
⛅以下这些类型都内置 "__iter__" 方法
str1='hello'
list1=[1,2,3]
tup1=(1,2,3)
dic={'x':1}
s1={'a','b','c'}
f=open('a.txt','w',encoding='utf-8')
四. 迭代器对象 (iterator)
- 内置有
__next__
和__init__
方法的对象, 就是迭代器对象 - 可迭代对象执行
__iter__
得到的返回值就是迭代器对象
dic={'x':1,'y':2,'z':3}
iter_dic=dic.__iter__() # 获取迭代器版本
print(next(iter_dic)) # 每次取出一个值 x
print(next(iter_dic)) # y
print(next(iter_dic)) # z
print(next(iter_dic)) #只有三个值,第四次报错
s1={'a','b','c'}
iter_s1=s1.__iter__() # 获取迭代器版本
print(next(iter_s1)) # 每次取出一个值 a
print(next(iter_s1)) # b
print(next(iter_s1)) # c
print(next(iter_s1)) #只有三个值,第四次报错
list1=[1,2,3]
iter_list1=list1.__iter__() # 获取迭代器版本
print(next(iter_list1)) # 每次取出一个值 1
print(next(iter_list1)) # 2
print(next(iter_list1)) # 3
print(next(iter_list1)) #只有三个值,第四次报错
.......
....
五. 可迭代对象 🆚 迭代器对象
1. 可迭代对象
str,list,tuple,dict,set,file
- 获取可迭代对象的方式
无需获取, Python 内置的 (str,list,tuple,dict,set,file) 都是可迭代对象
- 特点
内置有 "__iter__" 方法的都叫可迭代的对象,执行该方法会拿到一个迭代器对象
2. 迭代器对象
ps : 文件本身就是迭代器对象
- 获取迭代器的方式
执行可迭代对象 "__iter__" 方法, 拿到的返回值就是迭代器对象
- 特点
内置有 "__next__" 方法, 执行该方法会拿到迭代器对象中的一个值
内置有 "__iter__" 方法, 执行该方法会拿到迭代器本身 ----> 为了让 "for" 循环的设计更简单
3. 文件本身就是迭代器对象
f=open('a.txt','w',encoding='utf-8')
print(f.__next__()) # 直接可以调用 "__next__" 方法
六. 迭代器的优缺点分析
1. 优点
- 提供了一种 不依赖于索引 的通用迭代取值方案
- 惰性计算, 节省内存 (需要值, next 一下)
l=[1,2,3,4,4,5,5,6,6,6,6,6,6,6,6,6]
iter_l=l.__iter__()
print(iter_l)
print(iter_l.__next__()) # 1
l=open('a.txt','r',encoding='utf-8')
iter_l=l.__iter__()
while True:
try: # 捕捉异常
print(iter_l.__next__()) # 循环取值, 每次内存中只有一行
except StopIteration: # 遇到此异常(没值了)
break # 结束循环
2. 缺点
- 取值麻烦, 只能一个一个取, 只能往后取
- 无法预测值的长度
- 并且是一次性的
x=[1,2,3]
iter_x=x.__iter__() # 获得迭代器对象
while True:
try:
print(iter_x.__next__()) # 循环取值
except StopIteration:
break
print('第二次取值尝试 ======》') # 这里无法第二次取值,迭代器的值已经被取完
iter_x=x.__iter__() # 需要重新获取迭代器
while True:
try:
print(iter_x.__next__())
except StopIteration:
break
七. For 循环原理分析
-
For
循环被称为迭代器循环,in
后跟的必须是可迭代对象 -
For
循环会执行in
后面可迭代对象的__iter__
方法, 拿到迭代器对象 -
然后调用迭代器对象的
__next__
方法,拿到一个返回值赋值给line
,执行一次循环体 -
周而复始, 直到取值完毕,
For
循环会检测异常自动结束循环
l=open('a.txt','r',encoding='utf-8')
for line in l: #iter_l=l.__iter__()
print(line)
l.close()
for item in {'x':1,'y':2}:
print(item)
正文完